package org.demo.base.proxy.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;

/**
 * 实现日志打印工具
 * 1.可以在任何地方使用工具类打印日志，不再为类添加静态变量Logger
 * 2.实现运行期间各个级别的单独运行    (这里的问题描述有点问题)
 * 思考：
 *  如何获取LoggerFactory.getLogger(String className) 的className参数,此参数不是当前类，而是方法调用所在类
 *      获取当前类方法：
 *          静态方法：Thread.currentThread().getStackTrace()[1].getClassName()
 *          非静态方法：this.class
 *      获取方法调用所在类方法：
 *          Thread.currentThread().getStackTrace()[2].getClassName()                        √
 *  使用动态代理方式来在方法调用时获取调用类class name 赋值给LoggerFactory
 *
 */
public final class LogUtils {

    private LogUtils(){

    }

    public static void logger(Level level,String format,Object... object ){
        Logger logger = LoggerFactory.getLogger(Thread.currentThread().getStackTrace()[2].getClassName());
        switch (level){
            case TRACE:
                logger.trace(format,object);
                break;
            case DEBUG:
                logger.debug(format,object);
                break;
            case INFO:
                logger.info(format,object);
                break;
            case WARN:
                logger.warn(format,object);
                break;
            case ERROR:
                logger.error(format,object);
                break;
            default:
                logger.trace(format,object);
                break;
        }
    }

    public static void logger(Level level,String format){
        Logger logger = LoggerFactory.getLogger(Thread.currentThread().getStackTrace()[2].getClassName());
        switch (level){
            case TRACE:
                logger.trace(format);
                break;
            case DEBUG:
                logger.debug(format);
                break;
            case INFO:
                logger.info(format);
                break;
            case WARN:
                logger.warn(format);
                break;
            case ERROR:
                logger.error(format);
                break;
            default:
                logger.trace(format);
                break;
        }
    }
    public static void logger(String format){
        logger(Level.DEBUG,format);
    }
}
